在 NestJS 中,設定管理是一項基礎但關鍵的工作。
NestJS 官方提供 @nestjs/config,支援 .env 檔讀取與基本類型驗證。若搭配 Joi 或 registerAs(),也可達到較高程度的結構與驗證控制。不過在開發實務中,如果你偏好 ASP.NET Core 那種透過 IOptions<T> 強型別設定物件進行注入的風格,NestJS 並沒有直接對應的設計。
nest-simple-config 則提供了一個更直覺的方式,讓設定管理具備以下特色:
@InjectConfig() + Options<T> 注入方式ASP.NET Core 的 IOptions<T> 使用體驗nest-simple-config 的情境class 定義設定資料nest-simple-config 套件安裝npm i --save nest-simple-config
appsettings.json){
"database": {
"host": "localhost",
"port": 3306
}
}
database-options.ts)import { IsString, IsInt } from 'class-validator';
import { BindOption } from '@mediaedge4tw/nest-simple-config';
@BindOption('database')
export class DatabaseOptions {
@IsString()
host!: string;
@IsInt()
port!: number;
}
SimpleConfigModule.forRoot({
configFileOptions: { filename: 'appsettings.json' },
}),
SimpleConfigModule.registerOptions([DatabaseOptions])
@Injectable()
export class MyService {
constructor(
@InjectConfig(DatabaseOptions)
private readonly db: Options<DatabaseOptions>,
) {
console.log(db.value.host); // 已驗證、具型別安全
}
}
若不想定義設定類別,也可以直接注入 Configuration,並透過 .get<T>() 取得設定值:
type DatabaseConfig = {
host: string;
port: number;
};
@Injectable()
export class SimpleService {
constructor(private readonly config: Configuration) {
const databaseConfig = this.config.get<DatabaseConfig>('database');
console.log(`Database port is ${databaseConfig.port}`);
}
}
這種方式類似 @nestjs/config 的 ConfigService.get(),但資料來源來自經過 nest-simple-config 合併處理的 JSON/YAML/ENV 設定內容,仍保有一致性與覆寫邏輯。
@nestjs/config vs nest-simple-config| 能力 | @nestjs/config |
nest-simple-config |
|---|---|---|
| ✅ 設定類別綁定 | ✅ 使用泛型 (ConfigType<typeof x>) 搭配 registerAs() |
✅ 使用 @BindOption() 裝飾器,設定類別即為可被 Option 注入型別 |
| ✅ 啟動時驗證 | ✅ 支援 Joi schema 或自訂 validate() 處理 |
✅ 使用 class-validator 驗證類別屬性,失敗即阻止啟動 |
| ✅ 巢狀結構支援 | ✅ 需手動撰寫 config factory 並明確轉型 | ✅ 自動處理巢狀結構並轉換為設定類別 |
| ✅ 多來源合併 | 🔶 須自行設計 .env / YAML / registerAs 的合併流程 |
✅ 預設依來源優先順序合併設定(JSON/YAML → ENV),也可透過 provider builder 自訂策略 |
| ✅ 設定 DI 模式 | 🔶 使用 ConfigService.get() + dot notation |
✅ 支援 @InjectConfig() 直接注入 Options<T>,模擬 ASP.NET Core IOptions<T>,也支援直接注入 Configuration.get() 方式 |
@nestjs/config 功能非常完整,透過手動組合也能實現型別與驗證支援。但若你想要:
那麼 nest-simple-config 會是更簡潔的選擇。
2.1.0
有任何改善建議,歡迎開 Issue 或 PR 一起來參與改善喔!